﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DapperExtensions;
using Dapper;

namespace BLevy.Datos.Repositories
{
    public interface ICiudadRepository : IRepository<Ciudad>
    {
        IList<Ciudad> FindAllConProvincia();
        IList<Ciudad> FindAllPorProvincia(int provincia_id);
        IList<Ciudad> FindAllPorProvinciaActivos(int provincia_id);
        IList<Ciudad> FindAllActivos();
    }

    public class CiudadRepository : ICiudadRepository
    {
        protected readonly IDbConnection _db;

        public CiudadRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public IList<Ciudad> FindAll()
        {
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad>("SELECT * FROM CIUDADES").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IQueryable<Ciudad> Find(System.Linq.Expressions.Expression<Func<Ciudad, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Ciudad FindById(int id)
        {
            string query = "SELECT * FROM CIUDADES " +
                "WHERE ID = " + id;

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad>(query).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Add(Ciudad newEntity)
        {
            string query = "INSERT INTO CIUDADES (PROVINCIA_ID, CIUDAD, ACTIVO) " +
                "VALUES (@provincia_id, @ciudad, @activo)";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = newEntity.provincia_id,
                        ciudad = newEntity.ciudad,
                        activo = newEntity.activo
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Remove(int id)
        {
            string query = "UPDATE CIUDADES SET ACTIVO = 0 " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new { id = id });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Modify(Ciudad entity)
        {
            string query = "UPDATE CIUDADES SET PROVINCIA_ID = @provincia_id, CIUDAD = @ciudad, ACTIVO = @activo " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = entity.provincia_id,
                        ciudad = entity.ciudad,
                        activo = entity.activo,
                        id = entity.id
                    });
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public IList<Ciudad> FindAllConProvincia()
        {
            string query = "SELECT * FROM CIUDADES " +
                "INNER JOIN PROVINCIAS ON PROVINCIAS.ID = CIUDADES.PROVINCIA_ID " +
                "ORDER BY CIUDADES.ID ASC";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad, Provincia, Ciudad>(query, (ciudad, provincia) =>
                    {
                        ciudad.provincia = provincia;
                        return ciudad;
                    },
                        splitOn: "id").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }


        public IList<Ciudad> FindAllPorProvincia(int provincia_id)
        {
            string query = "SELECT * FROM CIUDADES " +
                "WHERE PROVINCIA_ID = " + provincia_id;

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }


        public IList<Ciudad> FindAllActivos()
        {
            string query = "SELECT * FROM CIUDADES " +
                "WHERE ACTIVO = 1 " +
                "ORDER BY ID ASC";
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Ciudad> FindAllPorProvinciaActivos(int provincia_id)
        {
            string query = "SELECT * FROM CIUDADES " +
               "WHERE PROVINCIA_ID = " + provincia_id + " AND ACTIVO = 1";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Ciudad>(query).ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }
    }
}
